//package _rabbitmq.aliyun;
//
//import com.rabbitmq.client.AMQP;
//import com.rabbitmq.client.Channel;
//import com.rabbitmq.client.Connection;
//import com.rabbitmq.client.ConnectionFactory;
//import com.rabbitmq.client.DefaultConsumer;
//import com.rabbitmq.client.Envelope;
//
//import java.io.IOException;
//import java.nio.charset.StandardCharsets;
//import java.util.HashMap;
//import java.util.concurrent.ExecutionException;
//import java.util.concurrent.TimeoutException;
//
//public class ConsumerTest {
//    // 推荐将AK/SK/ARN等信息在环境变量中配置，若将其明文保存在工程代码中，将带来不必要的数据泄露风险。
//    // 阿里云账号的AccessKey ID。
//    private static final String alibabaAccessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
//    // 阿里云账号的AccessKey Secret。
//    private static final String alibabaAccessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
//    // 阿里云服务所在的Region。
//    private static final String region = System.getenv("ALIBABA_CLOUD_REGION");
//    // 阿里云角色ARN，从控制台获取。
//    private static final String roleARN = System.getenv("ALIBABA_CLOUD_ROLE_ARN");
//    //设置实例的接入点。
//    private static final String hostName = "xxx.xxx.aliyuncs.com";
//    private static final String instanceId = "${InstanceId}";
//    //设置实例的Vhost。
//    private static final String virtualHost = "${VirtualHost}";
//    //设置Queue。
//    private static final String queueName = "${QueueName}";
//
//    public static void main(String[] args) throws IOException, TimeoutException, ExecutionException, InterruptedException {
//        ConnectionFactory factory = new ConnectionFactory();
//        // 设置接入点，在云消息队列 RabbitMQ 版控制台实例详情页面查看。
//        factory.setHost(hostName);
//        // ${instanceId}为实例ID，在云消息队列 RabbitMQ 版控制台概览页面查看。
//        AliyunCredentialsProvider aliyunCredentialsProvider =
//                new AliyunCredentialsProvider(instanceId);
//        updateSTSProperties(aliyunCredentialsProvider);
//        factory.setCredentialsProvider(aliyunCredentialsProvider);
//        //设置为true，开启Connection自动恢复功能；设置为false，关闭Connection自动恢复功能。
//        factory.setAutomaticRecoveryEnabled(true);
//        factory.setNetworkRecoveryInterval(5000);
//        // 设置Vhost名称，请确保已在云消息队列 RabbitMQ 版控制台上创建完成。
//        factory.setVirtualHost(virtualHost);
//        // 默认端口，非加密端口5672，加密端口5671。
//        factory.setPort(5672);
//        factory.setConnectionTimeout(300 * 1000);
//        factory.setHandshakeTimeout(300 * 1000);
//        factory.setShutdownTimeout(0);
//        Connection connection = factory.newConnection();
//        Channel channel = connection.createChannel();
//        // 创建${QueueName} ，该Queue必须在云消息队列 RabbitMQ 版控制台上已存在。
//        AMQP.Queue.DeclareOk queueDeclareOk = channel.queueDeclare(queueName, true, false, false, new HashMap<String, Object>());
//        consume(channel, queueName);
//        System.out.println("Consumer started.");
//
//        // 循环检测sts是否即将过期，若过期则更新connection，重新消费。
//        // 这里为了方便理解，使用while循环检测认证是否接近过期。
//        // 可以使用定时任务，更优雅地实现定时检查、更新操作。
//        while (true) {
//            // 每次处理完消息后，可以判断是否接近过期。
//            // 如果接近过期，则更新一次认证类，
//            // 该过程需要重新创建连接，以确保业务持续运行。
//            if (aliyunCredentialsProvider.isNearlyExpired()) {
//                System.out.println("token maybe expired, so try to update it.");
//                updateSTSProperties(aliyunCredentialsProvider);
//                factory.setCredentialsProvider(aliyunCredentialsProvider);
//                connection.close();
//                connection = factory.newConnection();
//                channel = connection.createChannel();
//                // 重新开始消费消息。
//                consume(channel, queueName);
//                System.out.println("Consumer started.");
//            } else {
//                // 每秒检测一次。
//                Thread.sleep(1000);
//            }
//        }
//    }
//
//    public static void consume(Channel channel, String queueName) throws IOException {
//
//        channel.basicConsume(queueName, false, "ConsumerTag", new DefaultConsumer(channel) {
//            @Override
//            public void handleDelivery(String consumerTag, Envelope envelope,
//                                       AMQP.BasicProperties properties, byte[] body) {
//                try {
//                    //接收到的消息，进行业务逻辑处理。
//                    System.out.println("Received： " + new String(body, StandardCharsets.UTF_8) + ", deliveryTag: " + envelope.getDeliveryTag() + ", messageId: " + properties.getMessageId());
//                    channel.basicAck(envelope.getDeliveryTag(), false);
//                } catch (Exception e) {
//                    System.out.println("Exception, cause:" + e.getMessage());
//                }
//            }
//        });
//    }
//
//    public static void updateSTSProperties(AliyunCredentialsProvider aliyunCredentialsProvider) throws ExecutionException, InterruptedException {
//        System.out.println("Try to update STS properties");
//        aliyunCredentialsProvider.updateProperties(alibabaAccessKeyId, alibabaAccessKeySecret, region, roleARN);
//    }
//}